/** * BSD-style license; for more info see http://pmd.sourceforge.net/license.html */ package test.net.sourceforge.pmd.ast; import net.sourceforge.pmd.PMD; import net.sourceforge.pmd.ast.ASTBlock; import net.sourceforge.pmd.ast.ASTBlockStatement; import net.sourceforge.pmd.ast.ASTEqualityExpression; import net.sourceforge.pmd.ast.ASTExpression; import net.sourceforge.pmd.ast.ASTInstanceOfExpression; import net.sourceforge.pmd.ast.ASTMethodDeclaration; import net.sourceforge.pmd.ast.ASTName; import net.sourceforge.pmd.ast.ASTRelationalExpression; import net.sourceforge.pmd.ast.ASTReturnStatement; import net.sourceforge.pmd.ast.ASTUnmodifiedClassDeclaration; import net.sourceforge.pmd.ast.ASTVariableInitializer; import net.sourceforge.pmd.ast.SimpleNode; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.Set; public class SimpleNodeTest extends ParserTst { public void testMethodDiffLines() throws Throwable { Set methods = getNodes(ASTMethodDeclaration.class, METHOD_DIFF_LINES); Iterator iter = methods.iterator(); verifyNode((SimpleNode) iter.next(), 2, 2, 4, 2); } public void testMethodSameLine() throws Throwable { Set methods = getNodes(ASTMethodDeclaration.class, METHOD_SAME_LINE); verifyNode((SimpleNode) methods.iterator().next(), 2, 2, 2, 21); } public void testNoLookahead() throws Throwable { String code = NO_LOOKAHEAD; // 1, 8 -> 1, 20 Set uCD = getNodes(ASTUnmodifiedClassDeclaration.class, code); verifyNode((SimpleNode) uCD.iterator().next(), 1, 8, 1, 20); } public void testHasExplicitExtends() throws Throwable { String code = HAS_EXPLICIT_EXTENDS; ASTUnmodifiedClassDeclaration ucd = (ASTUnmodifiedClassDeclaration)(getNodes(ASTUnmodifiedClassDeclaration.class, code).iterator().next()); assertTrue(ucd.hasExplicitExtends()); } public void testNoExplicitExtends() throws Throwable { String code = NO_EXPLICIT_EXTENDS; ASTUnmodifiedClassDeclaration ucd = (ASTUnmodifiedClassDeclaration)(getNodes(ASTUnmodifiedClassDeclaration.class, code).iterator().next()); assertTrue(!ucd.hasExplicitExtends()); } public void testHasExplicitImplements() throws Throwable { String code = HAS_EXPLICIT_IMPLEMENTS; ASTUnmodifiedClassDeclaration ucd = (ASTUnmodifiedClassDeclaration)(getNodes(ASTUnmodifiedClassDeclaration.class, code).iterator().next()); assertTrue(ucd.hasExplicitImplements()); } public void testNoExplicitImplements() throws Throwable { String code = NO_EXPLICIT_IMPLEMENTS; ASTUnmodifiedClassDeclaration ucd = (ASTUnmodifiedClassDeclaration)(getNodes(ASTUnmodifiedClassDeclaration.class, code).iterator().next()); assertTrue(!ucd.hasExplicitImplements()); } public void testColumnsOnQualifiedName() throws Throwable { Set name = getNodes(ASTName.class, QUALIFIED_NAME); Iterator i = name.iterator(); while (i.hasNext()) { SimpleNode node = (SimpleNode) i.next(); if (node.getImage().equals("java.io.File")) { verifyNode(node, 1, 8, 1, 19); } } } public void testLineNumbersForNameSplitOverTwoLines() throws Throwable { Set name = getNodes(ASTName.class, BROKEN_LINE_IN_NAME); Iterator i = name.iterator(); while (i.hasNext()) { SimpleNode node = (SimpleNode) i.next(); if (node.getImage().equals("java.io.File")) { verifyNode(node, 1, 8, 2, 4); } if (node.getImage().equals("Foo")) { verifyNode(node, 2, 15, 2, 18); } } } public void testLineNumbersAreSetOnAllSiblings() throws Throwable { Set blocks = getNodes(ASTBlock.class, LINE_NUMBERS_ON_SIBLINGS); Iterator i = blocks.iterator(); while (i.hasNext()) { ASTBlock b = (ASTBlock)i.next(); assertTrue(b.getBeginLine() > 0); } blocks = getNodes(ASTVariableInitializer.class, LINE_NUMBERS_ON_SIBLINGS); i = blocks.iterator(); while (i.hasNext()) { ASTVariableInitializer b = (ASTVariableInitializer)i.next(); assertTrue(b.getBeginLine() > 0); } blocks = getNodes(ASTExpression.class, LINE_NUMBERS_ON_SIBLINGS); i = blocks.iterator(); while (i.hasNext()) { ASTExpression b = (ASTExpression)i.next(); assertTrue(b.getBeginLine() > 0); } } public void testFindChildrenOfType() { ASTBlock block = new ASTBlock(2); block.jjtAddChild(new ASTReturnStatement(1), 0); assertEquals(1, block.findChildrenOfType(ASTReturnStatement.class).size()); } public void testFindChildrenOfTypeMultiple() { ASTBlock block = new ASTBlock(1); block.jjtAddChild(new ASTBlockStatement(2), 0); block.jjtAddChild(new ASTBlockStatement(3), 1); List nodes = new ArrayList(); block.findChildrenOfType(ASTBlockStatement.class, nodes); assertEquals(2, nodes.size()); } public void testFindChildrenOfTypeRecurse() { ASTBlock block = new ASTBlock(1); ASTBlock childBlock = new ASTBlock(2); block.jjtAddChild(childBlock, 0); childBlock.jjtAddChild(new ASTMethodDeclaration(3), 0); List nodes = new ArrayList(); block.findChildrenOfType(ASTMethodDeclaration.class, nodes); assertEquals(1, nodes.size()); } public void testReplaceChild() { ASTEqualityExpression ee = new ASTEqualityExpression(1); ASTInstanceOfExpression io1 = new ASTInstanceOfExpression(2); ASTRelationalExpression re = new ASTRelationalExpression(3); ASTInstanceOfExpression io2 = new ASTInstanceOfExpression(2); ee.jjtAddChild(io1, 0); ee.jjtAddChild(io2, 1); io1.jjtAddChild(re, 0); ee.jjtReplaceChild(io1, re); assertEquals(ee.jjtGetChild(0), re); assertEquals(ee.jjtGetChild(1), io2); } private void verifyNode(SimpleNode node, int beginLine, int beginCol, int endLine, int endCol) { assertEquals("Wrong beginning line: ", beginLine, node.getBeginLine()); assertEquals("Wrong beginning column: ", beginCol, node.getBeginColumn()); assertEquals("Wrong ending line:", endLine, node.getEndLine()); assertEquals("Wrong ending column:", endCol, node.getEndColumn()); } private static final String HAS_EXPLICIT_EXTENDS = "public class Test extends Foo {}"; private static final String NO_EXPLICIT_EXTENDS = "public class Test {}"; private static final String HAS_EXPLICIT_IMPLEMENTS = "public class Test implements Foo {}"; private static final String NO_EXPLICIT_IMPLEMENTS = "public class Test {}"; private static final String METHOD_DIFF_LINES = "public class Test {" + PMD.EOL + " public void foo() {" + PMD.EOL + " int x;" + PMD.EOL + " }" + PMD.EOL + "}"; private static final String METHOD_SAME_LINE = "public class Test {" + PMD.EOL + " public void foo() {}" + PMD.EOL + "}"; private static final String QUALIFIED_NAME = "import java.io.File;" + PMD.EOL + "public class Foo{}"; private static final String BROKEN_LINE_IN_NAME = "import java.io." + PMD.EOL + "File;" + PMD.EOL + "public class Foo{}"; private static final String LINE_NUMBERS_ON_SIBLINGS = "public class Foo {" + PMD.EOL + " void bar() {" + PMD.EOL + " try {" + PMD.EOL + " } catch (Exception1 e) {" + PMD.EOL + " int x =2;" + PMD.EOL + " }" + PMD.EOL + " if (x != null) {}" + PMD.EOL + " }" + PMD.EOL + "}"; private static final String NO_LOOKAHEAD = "public class Foo { }"; }